今天要來介紹 Qt 的檔案處理功能。雖然 C++ 標準函式庫也有檔案處理的能力,但是在跨平台方面,特別是關於Unicode 檔案路徑的部份,一直有些微妙的問題。
這點 Qt 就處理的相當好,在跨平台以及各國語言的支援上,都領先標準函式庫而且相當完善。今天就介紹幾個檔案相關的基本類別
QFile 是最基本的檔案處理類別。
這裡示範的最基本的用法:
QFile file("in.txt");
if (file.open(QFile::ReadOnly | QFile::Text))
{
while (!file.atEnd()) {
QByteArray line = file.readLine();
process_line(line);
}
}
創建 QFile 物件的同時傳入檔案路徑,然後用 open() 函數開啟檔案的同時,指定使用目的(唯讀、讀寫、純文字或是二進位)。接著用 readLine() 來讀取內容,並且用 atEnd() 來檢查是否已經到達檔案結尾。
QFileInfo 則是獲取檔案本身以外的各種資訊,像是檔名、副檔名、完整路徑、檔案大小、目錄等等的好用類別。
我們在D17: 看圖軟體(五) 狀態列 中就已經使用 QFileInfo 來獲取檔案的大小。
QTextStream 是特別用於讀取文字流的類別。通常搭配 QFile 使用,可以強化 QFile 貧弱的文字處理能力,而且會幫你搞定編碼問題。
逐行讀取文字檔的範例:
QFile f("input.txt");
if (f.open(QFile::ReadOnly | QFile::Text))
{
QTextStream sin(&f);
while(!sin.atEnd())
{
QString line = sin.readLine();
...
}
}
除了讀取,也可以寫檔:
QFile f("output.txt");
if (f.open(QFile::WriteOnly | QFile::Truncate)) {
QTextStream sout(&data);
sout << "Result: " << 85 << " Degrees"; // 可用 operator<<
}